package uva.sc.ql.gui;
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.antlr.v4.runtime.RecognitionException;
import uva.sc.ql.ast.IQLFormNodeVisitor;
import uva.sc.ql.ast.IQLStatementNodeVisitor;
import uva.sc.ql.atom.ID;
import uva.sc.ql.evaluator.QuestionsPropertiesVisitor;
import uva.sc.ql.form.Form;
import uva.sc.ql.gui.helpers.QuestionData;
import uva.sc.ql.gui.questions.QuestionFactory;
import uva.sc.ql.patronElements.PatronQuestionsVisitor;
import uva.sc.ql.statements.IfStatement;
import uva.sc.ql.statements.Question;
import uva.sc.ql.statements.Statement;
@SuppressWarnings({ "serial" })
public class GUIVisitor extends JFrame implements
IQLFormNodeVisitor<Component>, IQLStatementNodeVisitor<Component> {
private Map<ID, List<ID>> patronElements;
private List<Component> componentList = new ArrayList<Component>();
private QuestionsPropertiesVisitor questionProperties;
private ID currentElement;
public GUIVisitor(QuestionsPropertiesVisitor questionsProperties,
PatronQuestionsVisitor patronQuesionVisitor) {
this.patronElements = patronQuesionVisitor.getPatronElements();
this.questionProperties = questionsProperties;
}
public List<Component> getComponentList() {
return componentList;
}
public Component visit(Form questionnaire) throws RecognitionException {
List<Statement> statements = questionnaire.getStatements();
for (Statement statement : statements) {
statement.accept(this);
}
return null;
}
public JPanel visit(Question question) {
currentElement = question.getId();
boolean isEditable = false;
QuestionData data = questionProperties.questionData(currentElement);
QuestionFactory questionFactory = new QuestionFactory();
uva.sc.ql.gui.questions.Question questionGUI = questionFactory
.questionType(question, questionProperties, patronElements,
componentList);
if (data != null) {
isEditable = data
.evaluateValue(questionProperties.getValuesTable()) == null;
}
componentList.add(questionGUI.drawQuestion(currentElement,
question.getStr(), isEditable));
return null;
}
public JPanel visit(IfStatement ifStatement) {
List<Question> questions = ifStatement.getQuestions();
for (Question question : questions) {
question.accept(this);
}
return null;
}
}